/**
 * ============================  angular-ios9-uiwebview.patch.js v1.0.3 ============================
 *
 * This patch works around iOS9 UIWebView regression that causes infinite digest errors in Angular.
 *
 * The patch can be applied to Angular 1.2.0 – 1.4.5. Newer versions of Angular have the workaround baked in.
 *
 * To apply this patch load/bundle this file with your application and add a dependency on the "ngIOS9Patch" module
 * to your main app module.
 *
 * For example:
 *
 * ```
 * angular.module('myApp', ['ngRoute'])`
 * ```
 *
 * becomes
 *
 * ```
 * angular.module('myApp', ['ngRoute', 'ngIOS9UIWebViewPatch'])
 * ```
 *
 *
 * More info:
 * - https://openradar.appspot.com/22186109
 * - https://github.com/angular/angular.js/issues/12241
 * - https://github.com/driftyco/ionic/issues/4082
 *
 *
 * @license AngularJS
 * (c) 2010-2015 Google, Inc. http://angularjs.org
 * License: MIT
 */

angular.module('ngIOS9UIWebViewPatch', ['ng']).config(function($provide) {

    $provide.decorator('$browser', ['$delegate', '$window', function($delegate, $window) {

        if (isIOS9UIWebView($window.navigator.userAgent)) {
            return applyIOS9Shim($delegate);
        }

        return $delegate;

        function isIOS9UIWebView (userAgent) {

            return true;
            // return /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);

        }

        function applyIOS9Shim (browser) {

            var pendingLocationUrl = null;
            var patchedBrowser = Object.create(browser);

            patchedBrowser.url = function() {
                if (arguments.length) {
                    pendingLocationUrl = arguments[0];
                    return browser.url.apply(patchedBrowser, arguments);
                }
                return pendingLocationUrl || browser.url();
            };

            window.addEventListener('popstate', clearPendingLocationUrl, false);
            window.addEventListener('hashchange', clearPendingLocationUrl, false);

            function clearPendingLocationUrl () {
                pendingLocationUrl = null;
            }

            return patchedBrowser;

        }

    }]);

});
